package network

import (
	"github.com/vishvananda/netlink"
	"net"
)

// Network 网络
type Network struct {
	Name    string     // 网络名
	IpRange *net.IPNet // 地址段
	Driver  string     // 网络驱动名
}

// Endpoint 网络端点
type Endpoint struct {
	ID          string           `json:"id"`
	Device      netlink.Veth     `json:"dev"` // 与端点关联的网络设备，可能代表虚拟以太网设备
	IPAddress   net.IP           `json:"ip"`  // 端点的 IP 地址
	MacAddress  net.HardwareAddr `json:"mac"` // 端点的 MAC 地址（硬件地址）
	Network     *Network         // 端点所属的网络
	PortMapping []string         // 端点的端口映射信息，通常用于容器或其他网络隔离环境
}

// Driver  网络驱动接口
type Driver interface {
	// Name 驱动名
	Name() string
	// Create 创建网络
	Create(subnet string, name string) (*Network, error)
	// Delete 删除网络
	Delete(network *Network) error
	// Connect 连接容器网络端点到网络，内部会修改 endpoint.Device，必须传指针
	Connect(networkName string, endpoint *Endpoint) error
	// Disconnect 从网络上移除容器网络端点
	Disconnect(endpointID string) error
}

type IPAMer interface {
	Allocate(subnet *net.IPNet) (ip net.IP, err error) // 从指定的 subnet 网段中分配 IP 地址
	Release(subnet *net.IPNet, ipaddr *net.IP) error   // 从指定的 subnet 网段中释放掉指定的 IP 地址
}
